package java学习.第08章_面向对象编程_高级;

/**
 * 对属性可以赋值的位置:
 * ①默认初始化
 * ②显式初始化/⑤在代码块中赋值
 * ③构造器中初始化
 * ④有了对象以后，可以通过"对象。属性"或"对象.方法"的方式，进行赋值
 *
 * 执行的先后顺序:①-②/⑤-③-④
 *
 * ②显式初始化/⑤在代码块中赋值
 *  是谁靠前先加载那个，后加载的会覆盖
 *  但是发现，为啥此属性还没存在，就能使用了，
 *  其实类的加载，是先都加载，最后才开始赋值
 *
 * 在字节码文件中 <init> 可以看见，
 * 每个 <init>都对应着一个类的构造器，他是用来初始化当前常见对象的信息
 */

public class C_代码块 {

    /**
     * 代码块
     * <p>
     * 1.代码块的作用:用来初始化类、对象
     * 2.代码块如果有修饰的话，只能使用static .
     * 3.分类:静态代码块  VS  非静态代码块
     * 静态代码块    可以有多个（没必要）
     * >可以有输出语句
     * >随着类的加载而执行 只执行一次
     * >作用:初始化类的信息
     * <p>
     * 非静态代码块
     * >可以有输出语句
     * >随着对像的创建而执行
     * >每创建一次   就执行一次非静态代码块
     * >作用:可以在创建对象时，对 对象的属性等进行初始化
     */
    public static void main(String[] args) {

        System.out.println("起始点=========================");
        new AA();//如过有父类   先静态后其他 先父在子
        System.out.println("-----------------------");
        new AA();
        System.out.println("-----------------------");
        new C_代码块();
    }

    {//对象每创建一次，就会执行一次代码块
        System.out.println("main代  码 块44444");//非静态代码块
    }

    static {//类创建的时候执行一次
        System.out.println("main静态代码块555555");
    }

    public C_代码块() {
        System.out.println("main构 造 方 法66666");
    }

}

class AA {
    int a = 1;

    public AA() {
        System.out.println("AA构 造 方 法11111");
    }
    {
        a = 2;//a在之前声明   a的值按照  后面的来
        b = 2;//b在之后声明   b的值按照  后面的来
        System.out.println("AA代  码  块22222");
    }
    int b = 1;
    static {
        System.out.println("AA静态代码块33333:");
    }

    static final String s = qq88();

    public final static String qq88() {
        System.out.println("final6");
        return "5";
    }
}
